package uno.linze.interview_question.util.base;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 通用API响应结果类
 * 统一所有接口的返回格式
 */
@Data
@ApiModel(description = "API响应结果")
public class ApiResponse<T> {

    @ApiModelProperty(value = "状态码：200成功，400参数错误，401未登录，403无权限，500服务器错误", required = true)
    private int code;

    @ApiModelProperty(value = "操作结果描述信息", required = true)
    private String message;

    @ApiModelProperty(value = "业务数据")
    private T data;

    /**
     * 私有构造方法，防止直接实例化
     */
    private ApiResponse() {}

    /**
     * 成功响应（不带数据）
     * @param message 成功信息
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> success(String message) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(200);
        response.setMessage(message);
        response.setData(null);
        return response;
    }

    /**
     * 成功响应（带数据）
     * @param message 成功信息
     * @param data 业务数据
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> success(String message, T data) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(200);
        response.setMessage(message);
        response.setData(data);
        return response;
    }

    /**
     * 错误响应
     * @param code 错误状态码
     * @param message 错误信息
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> error(int code, String message) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(code);
        response.setMessage(message);
        response.setData(null);
        return response;
    }

    /**
     * 错误响应（带错误数据）
     * @param code 错误状态码
     * @param message 错误信息
     * @param data 错误相关数据
     * @return ApiResponse对象
     */
    public static <T> ApiResponse<T> error(int code, String message, T data) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(code);
        response.setMessage(message);
        response.setData(data);
        return response;
    }
}
